package com.dragon.modules.yuegou.model.message;

import com.dragon.modules.yuegou.entity.message.MessageEntity;
import com.dragon.modules.yuegou.enums.MsgType;
import com.dragon.modules.yuegou.enums.Platform;
import com.dragon.modules.yuegou.enums.message.MessageChannel;
import com.dragon.modules.yuegou.enums.message.MessageFromType;
import com.dragon.modules.yuegou.enums.message.MessageSystemType;
import com.dragon.modules.yuegou.enums.message.MessageToType;
import com.dragon.modules.yuegou.model.member.Member;
import io.swagger.annotations.ApiModelProperty;
import org.hibernate.validator.constraints.Length;

import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.util.List;

/**
 * 消息模型类
 * 
 * @author pbuilder generated
 * @date 2019-07-03 16:32:27
 * @company sgy
 * @version 2.0
 * @see Length 长度限制
 * @see NotNull 对象非空
 * @see NotEmpty 字符串、集合、表、数组非空
 */
public class Message extends MessageEntity {

	@ApiModelProperty("用户头像")
	private String fromImg;
	
	@ApiModelProperty("用户昵称")
	private String nickName;
	
	@ApiModelProperty("用户信息")
	private List<Member> members;
	
	@ApiModelProperty("点赞/关注数量")
	private Integer quantityl;

	/**消息总条数**/
	private Integer mesTotal;
	/**已读消息总条数**/
	private Integer recived;

	private LocalDateTime lastMsgTime;

	private Integer noReadTotal;

	public Integer getNoReadTotal() {
		return noReadTotal;
	}

	public void setNoReadTotal(Integer noReadTotal) {
		this.noReadTotal = noReadTotal;
	}

	public LocalDateTime getLastMsgTime() {
		return lastMsgTime;
	}

	public void setLastMsgTime(LocalDateTime lastMsgTime) {
		this.lastMsgTime = lastMsgTime;
	}

	public Integer getRecived() {
		return recived;
	}

	public void setRecived(Integer recived) {
		this.recived = recived;
	}

	public Integer getMesTotal() {
		return mesTotal;
	}

	public void setMesTotal(Integer mesTotal) {
		this.mesTotal = mesTotal;
	}

	public String getNickName() {
		return nickName;
	}

	public void setNickName(String nickName) {
		this.nickName = nickName;
	}

	public String getFromImg() {
		return fromImg;
	}

	public void setFromImg(String fromImg) {
		this.fromImg = fromImg;
	}
	
	public List<Member> getMembers() {
		return members;
	}

	public void setMembers(List<Member> members) {
		this.members = members;
	}

	public Integer getQuantityl() {
		return quantityl;
	}

	public void setQuantityl(Integer quantityl) {
		this.quantityl = quantityl;
	}

	/**
	 * 构造一个空消息模型对象
	 */
	public Message(){
		super();
	}
	
	/**
	 * 依据实体对象的信息构造一个消息模型对象
	 * 
	 * @param entity 实体对象
	 */
	public Message(MessageEntity entity){
		super(entity);
	}

	/**
	 * 依据其它对象的信息构造一个消息模型对象
	 * 
	 * @param other 其它对象
	 */
	public Message(Message other){
		super(other);
	}


	@Override
	public String getId() {
    	return id;
    }

    /**
	 * 设置消息ID
	 * 
	 * @param id 消息ID
	 * @return 当前对象
	 */
    public Message id(String id) {
    	this.id = id;
    	return this;
    }

	@Override
	public String getTemplateId() {
    	return templateId;
    }

    /**
	 * 设置消息模板ID
	 * 
	 * @param templateId 消息模板ID
	 * @return 当前对象
	 */
    public Message templateId(String templateId) {
    	this.templateId = templateId;
    	return this;
    }

	@Override
	public Platform getPlatform() {
    	return platform;
    }

    /**
	 * 设置[全局枚举]平台：0-悦商圈-YSQ_APP、1-悦购-YSQ_XCX、2-悦商惠小程序-YSQ_MERCHANT_XCX、3-集团版-YSQ_GROUP、4-大运营平台-YSQ_PLATFORM
	 * 
	 * @param platform [全局枚举]平台：0-悦商圈-YSQ_APP、1-悦购-YSQ_XCX、2-悦商惠小程序-YSQ_MERCHANT_XCX、3-集团版-YSQ_GROUP、4-大运营平台-YSQ_PLATFORM
	 * @return 当前对象
	 */
    public Message platform(Platform platform) {
    	this.platform = platform;
    	return this;
    }

	@Override
	public MessageFromType getFromType() {
    	return fromType;
    }

    /**
	 * 设置[枚举]来源类型：0-会员-MEMBER、1-用户-USER、2-系统-SYSTEM
	 * 
	 * @param fromType [枚举]来源类型：0-会员-MEMBER、1-用户-USER、2-系统-SYSTEM
	 * @return 当前对象
	 */
    public Message fromType(MessageFromType fromType) {
    	this.fromType = fromType;
    	return this;
    }

	@Override
	public String getFromUser() {
    	return fromUser;
    }

    /**
	 * 设置用户/会员ID，由系统发出固定为1
	 * 
	 * @param fromUser 用户/会员ID，由系统发出固定为1
	 * @return 当前对象
	 */
    public Message fromUser(String fromUser) {
    	this.fromUser = fromUser;
    	return this;
    }

	@Override
	public MessageToType getToType() {
    	return toType;
    }

    /**
	 * 设置[枚举]目标类型：0-会员-MEMBER、1-用户-USER、2-系统-SYSTEM
	 * 
	 * @param toType [枚举]目标类型：0-会员-MEMBER、1-用户-USER、2-系统-SYSTEM
	 * @return 当前对象
	 */
    public Message toType(MessageToType toType) {
    	this.toType = toType;
    	return this;
    }

	@Override
	public String getToUser() {
    	return toUser;
    }

    /**
	 * 设置目标用户/会员ID，发给系统固定为1
	 * 
	 * @param toUser 目标用户/会员ID，发给系统固定为1
	 * @return 当前对象
	 */
    public Message toUser(String toUser) {
    	this.toUser = toUser;
    	return this;
    }

	@Override
	public MessageChannel getChannel() {
    	return channel;
    }

    /**
	 * 设置[枚举]消息通道：0-系统-SYSTEM、1-短信-SMS、2-邮件-EMAIL、3-极光推送-JPUSH、4-微信-WECHAT
	 * 
	 * @param channel [枚举]消息通道：0-系统-SYSTEM、1-短信-SMS、2-邮件-EMAIL、3-极光推送-JPUSH、4-微信-WECHAT
	 * @return 当前对象
	 */
    public Message channel(MessageChannel channel) {
    	this.channel = channel;
    	return this;
    }

	@Override
	public MsgType getMsgType() {
    	return msgType;
    }

    /**
	 * 设置[全局枚举]消息类型：0-文本消息-TEXT、1-语音消息-VOICE、2-APP消息-APP、3-HTML消息-HTML
	 * 
	 * @param msgType [全局枚举]消息类型：0-文本消息-TEXT、1-语音消息-VOICE、2-APP消息-APP、3-HTML消息-HTML
	 * @return 当前对象
	 */
    public Message msgType(MsgType msgType) {
    	this.msgType = msgType;
    	return this;
    }

	@Override
	public MessageSystemType getSystemType() {
    	return systemType;
    }

    /**
	 * 设置[枚举]系统消息类型：0-退款消息-REFUND、1-即将过期提醒-EXPIRED、2-悦卡发放提醒-LSSUE、3-点赞-LIKE、4-关注-ATTENTION
	 * 
	 * @param systemType [枚举]系统消息类型：0-退款消息-REFUND、1-即将过期提醒-EXPIRED、2-悦卡发放提醒-LSSUE、3-点赞-LIKE、4-关注-ATTENTION
	 * @return 当前对象
	 */
    public Message systemType(MessageSystemType systemType) {
    	this.systemType = systemType;
    	return this;
    }

	@Override
	public String getTitle() {
    	return title;
    }

    /**
	 * 设置消息标题
	 * 
	 * @param title 消息标题
	 * @return 当前对象
	 */
    public Message title(String title) {
    	this.title = title;
    	return this;
    }

	@Override
	public String getContent() {
		return content;
	}

    /**
	 * 设置消息内容
	 * 
	 * @param content 消息内容
	 * @return 当前对象
	 */
    public Message content(String content) {
    	this.content = content;
    	return this;
    }

	@Override
	public String getAudioBase64() {
    	return audioBase64;
    }

    /**
	 * 设置base64音频
	 * 
	 * @param audioBase64 base64音频
	 * @return 当前对象
	 */
    public Message audioBase64(String audioBase64) {
    	this.audioBase64 = audioBase64;
    	return this;
    }

	@Override
	public String getUrl() {
    	return url;
    }

    /**
	 * 设置跳转地址
	 * 
	 * @param url 跳转地址
	 * @return 当前对象
	 */
    public Message url(String url) {
    	this.url = url;
    	return this;
    }

	@Override
	public LocalDateTime getCreatedTime() {
    	return createdTime;
    }

    /**
	 * 设置创建时间
	 * 
	 * @param createdTime 创建时间
	 * @return 当前对象
	 */
    public Message createdTime(LocalDateTime createdTime) {
    	this.createdTime = createdTime;
    	return this;
    }

	@Override
	public Boolean getReached() {
    	return reached;
    }

    /**
	 * 设置是否已经触达
	 * 
	 * @param reached 是否已经触达
	 * @return 当前对象
	 */
    public Message reached(Boolean reached) {
    	this.reached = reached;
    	return this;
    }

	@Override
	public LocalDateTime getReachedTime() {
    	return reachedTime;
    }

    /**
	 * 设置触达时间
	 * 
	 * @param reachedTime 触达时间
	 * @return 当前对象
	 */
    public Message reachedTime(LocalDateTime reachedTime) {
    	this.reachedTime = reachedTime;
    	return this;
    }

	public int compareTo(Message message) {//重写Comparable接口的compareTo方法，
		return Integer.valueOf(String.valueOf(this.createdTime.toInstant(ZoneOffset.of("+8")).toEpochMilli() - message.getCreatedTime().toInstant(ZoneOffset.of("+8")).toEpochMilli()));// 根据时间升序排列，降序修改相减顺序即可
	}
}
